/* Copyright (c) 2009 José Joaquín Núñez (josejnv@gmail.com) http://joaquinnunez.cl/blog/
 * Licensed under GPL (http://www.opensource.org/licenses/gpl-2.0.php)
 * Use only for non-commercial usage.
 *
 * Version : 0.5
 *
 * Requires: jQuery 1.2+
 */
 
(function($)
{
  jQuery.fn.Rut = function(options)
  {
    var defaults = {
      digito_verificador: null,
      on_error: function(){},
      on_success: function(){},
      validation: true,
      format: true,
      format_on: 'change'
    };

    var opts = $.extend(defaults, options);

    return this.each(function(){
    
      if(defaults.format)
      {
        jQuery(this).bind(defaults.format_on, function(){
          jQuery(this).val(jQuery.Rut.formatear(jQuery(this).val(),defaults.digito_verificador==null));
        });
      }
      if(defaults.validation)
      {
        if(defaults.digito_verificador == null)
        {
          jQuery(this).bind('blur', function(){
            var rut = jQuery(this).val();
            if(jQuery(this).val() != "" && !jQuery.Rut.validar(rut))
            {
                defaults.on_error();
            }
            else if(jQuery(this).val() != "")
            {
                defaults.on_success();
            }
          });
        }
        else
        {
          var id = jQuery(this).attr("id");
          jQuery(defaults.digito_verificador).bind('blur', function(){
            var rut = jQuery("#"+id).val()+"-"+jQuery(this).val();
            if(jQuery(this).val() != "" && !jQuery.Rut.validar(rut))
            {
                defaults.on_error();
            }
            else if(jQuery(this).val() != "")
            {
                defaults.on_success();
            }
          });
        }
      }
    });
  }
})(jQuery);

/**
  Funciones
*/


jQuery.Rut = {

  formatear:  function(Rut, digitoVerificador)
          {
          var sRut = new String(Rut);
          var sRutFormateado = '';
          sRut = jQuery.Rut.quitarFormato(sRut);
          if(digitoVerificador){
            var sDV = sRut.charAt(sRut.length-1);
            sRut = sRut.substring(0, sRut.length-1);
          }
          while( sRut.length > 3 )
          {
            sRutFormateado = "." + sRut.substr(sRut.length - 3) + sRutFormateado;
            sRut = sRut.substring(0, sRut.length - 3);
          }
          sRutFormateado = sRut + sRutFormateado;
          if(sRutFormateado != "" && digitoVerificador)
          {
            sRutFormateado += "-"+sDV;
          }
          else if(digitoVerificador)
          {
            sRutFormateado += sDV;
          }
          
          return sRutFormateado;
        },

  quitarFormato: function(rut)
        {
          var strRut = new String(rut);
          while( strRut.indexOf(".") != -1 )
          {
          strRut = strRut.replace(".","");
          }
          while( strRut.indexOf("-") != -1 )
          {
          strRut = strRut.replace("-","");
          }
          
          return strRut;
        },

  digitoValido: function(dv)
        { 
          if ( dv != '0' && dv != '1' && dv != '2' && dv != '3' && dv != '4' 
            && dv != '5' && dv != '6' && dv != '7' && dv != '8' && dv != '9' 
            && dv != 'k'  && dv != 'K')
          {   
            return false; 
          } 
          return true;
        },

  digitoCorrecto:   function(crut)
          { 
            largo = crut.length;
            if ( largo < 2 )  
            {   
              return false; 
            }
            if(largo > 2)
            {
              rut = crut.substring(0, largo - 1);
            }
            else
            {   
              rut = crut.charAt(0);
            }
            dv = crut.charAt(largo-1);
            jQuery.Rut.digitoValido(dv);  
          
            if(rut == null || dv == null)
            {
              return 0;
            }

            dvr = jQuery.Rut.getDigito(rut);

            if (dvr != dv.toLowerCase())  
            {   
              return false;
            }
            return true;
          },

  getDigito:    function(rut)
        {
          var dvr = '0';
          suma = 0;
          mul  = 2;
          for(i=rut.length -1;i >= 0;i--) 
          { 
            suma = suma + rut.charAt(i) * mul;    
            if (mul == 7)
            {
              mul = 2;
            }   
            else
            {         
              mul++;
            } 
          }
          res = suma % 11;  
          if (res==1)
          {
            return 'k';
          } 
          else if(res==0)
          {   
            return '0';
          } 
          else  
          {   
            return 11-res;
          }
        },

  validar:   function(texto)
        {
          texto = jQuery.Rut.quitarFormato(texto);
          largo = texto.length;
        
          // rut muy corto
          if ( largo < 2 )  
          {
            return false; 
          }
    
          // verifica que los numeros correspondan a los de rut
          for (i=0; i < largo ; i++ ) 
          {   
            // numero o letra que no corresponda a los del rut
            if(!jQuery.Rut.digitoValido(texto.charAt(i)))
            {     
              return false;
            }
          }
    
          var invertido = "";
          for(i=(largo-1),j=0; i>=0; i--,j++)
          {
            invertido = invertido + texto.charAt(i);
          }
          var dtexto = "";
          dtexto = dtexto + invertido.charAt(0);
          dtexto = dtexto + '-';  
          cnt = 0;  
        
          for ( i=1,j=2; i<largo; i++,j++ ) 
          {
            if ( cnt == 3 )   
            {     
              dtexto = dtexto + '.';      
              j++;      
              dtexto = dtexto + invertido.charAt(i);      
              cnt = 1;    
            }
            else    
            {       
              dtexto = dtexto + invertido.charAt(i);      
              cnt++;    
            } 
          } 
        
          invertido = ""; 
          for (i=(dtexto.length-1),j=0; i>=0; i--,j++)
          {   
            invertido = invertido + dtexto.charAt(i);
          }
    
          if (jQuery.Rut.digitoCorrecto(texto))
          {   
            return true;
          }
          return false;
        }
};